﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Dominio;
using Interfaces;

namespace Obligatorio1
{
    public partial class VentanaTanque : Form
    {
        public VentanaTanque()
        {
            InitializeComponent();
        }

        private void ActualizarListaTanque()
        {
            ITanque it = new ImpITanque();
            listBoxTanques.Items.Clear();
            List<Tanque> listaNombre = it.ObtenerDatosTanques();
            foreach (var element in listaNombre)
            {
                listBoxTanques.Items.Add(element);
            }
            comboBoxTipoTanque.Items.Add("Aceite");
            comboBoxTipoTanque.Items.Add("Agua");
            comboBoxTipoTanque.Items.Add("Combustible");
        }

        private void buttonCrear_Click(object sender, EventArgs e)
        {
            if (ValidarCrearTanque())
            {
                string tipoTanque = comboBoxTipoTanque.SelectedItem.ToString();
                if (tipoTanque == "Agua")
                {
                    VentanaTanqueAgua vta = new VentanaTanqueAgua();
                    vta.Show();
                    this.Close();
                }
                else if (tipoTanque == "Aceite")
                {
                    VentanaTanqueAceite vta = new VentanaTanqueAceite();
                    vta.Show();
                    this.Close();
                }
                else if (tipoTanque == "Combustible")
                {
                    VentanaTanqueCombustible vta = new VentanaTanqueCombustible();
                    vta.Show();
                    this.Close();
                }
            }
        }

        private void buttonEliminar_Click(object sender, EventArgs e)
        {
            if (ValidarTanqueSeleccionado())
            {
                Tanque tanqueSeleccionado = (Tanque)listBoxTanques.SelectedItem;
                ITanque it = new ImpITanque();
                it.EliminarTanque(tanqueSeleccionado);
                ActualizarListaTanque();
            }
        }

        private bool ValidarTanqueSeleccionado()
        {
            if (listBoxTanques.SelectedIndex == -1)
            {
                MessageBox.Show("Error. Seleccione un tanque");
                return false;
            }
            return true;
        }

        private void VentanaTanque_Load(object sender, EventArgs e)
        {
            ActualizarListaTanque();
            comboBoxTipoTanque.SelectedIndex = 0;
        }

        private void cargarCombustibleButton_Click(object sender, EventArgs e)
        {
            if (ValidarTanqueSeleccionado())
            {
                Tanque tanqueSeleccionado = (Tanque)listBoxTanques.SelectedItem;
                VentanaMantenimiento ventanaMantenimiento = new VentanaMantenimiento(tanqueSeleccionado);
                ventanaMantenimiento.Show();
            }
        }

        private bool ValidarCrearTanque()
        {
            if (comboBoxTipoTanque.SelectedIndex == -1)
            {
                MessageBox.Show("Error. Por favor seleccione un tipo de tanque");
                return false;
            }
            return true;
        }

        private void textBoxDescripcion_TextChanged(object sender, EventArgs e)
        {

        }

        private void buttonAtras_Click(object sender, EventArgs e)
        {
            this.Hide();
        }

        private void listBoxTanques_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void LimpiezaButton_Click(object sender, EventArgs e)
        {
            if (ValidarTanqueSeleccionado())
            {
                foreach (Object selectedItem in listBoxTanques.SelectedItems){
                           
                    Tanque tanqueSeleccionado = (Tanque)selectedItem;
                    String tipoSeleccionado = tanqueSeleccionado.GetType().Name;
                    
                    switch (tipoSeleccionado)
                    {
                        case "TanqueAgua":
                            TanqueAgua tanqueAgua = tanqueSeleccionado as TanqueAgua;
                            TimeSpan diferencia = DateTime.Now - tanqueAgua.UltimaFechaLimpieza;
                            if (!tanqueAgua.LitrosDisponiblesAptoParaLimpieza())
                            {
                                MessageBox.Show("Error. El tanque debe contener menos de un 10% de su capacidad.");

                            }
                            else if (diferencia.TotalDays < 180)
                            {
                                MessageBox.Show("Error. La ultima fecha de limpieza fue hace menos de 6 meses.");
                            }
                            else
                            {
                                tanqueAgua.Limpieza(tanqueAgua);
                                MessageBox.Show("Correcto. La limpieza se ha completado.");
                            }
                            break;
                        case "TanqueAceite":
                            TanqueAceite tanqueAceite = tanqueSeleccionado as TanqueAceite;
                            TimeSpan diferenciaAceite = DateTime.Now - tanqueAceite.UltimaFechaLimpieza;
                            if (!tanqueAceite.LitrosDisponiblesAptoParaLimpieza())
                            {
                                MessageBox.Show("Error. El tanque debe contener menos de un 10% de su capacidad");

                            }
                            else if (diferenciaAceite.TotalDays < 365)
                            {
                                MessageBox.Show("Error. La última fecha de limpieza fue hace menos de 1 año");
                            }
                            else
                            {
                                tanqueAceite.Limpieza(tanqueAceite);
                                MessageBox.Show("Correcto. La limpieza se ha completado.");
                            }

                            break;
                        case "TanqueCombustible":
                            TanqueCombustible tanqueCombustible = tanqueSeleccionado as TanqueCombustible;
                            TimeSpan diferenciaCombustible = DateTime.Now - tanqueCombustible.UltimaFechaLimpieza;
                            if (!tanqueCombustible.LitrosDisponiblesAptoParaLimpieza())
                            {
                                MessageBox.Show("Error. El tanque debe contener menos de un 10% de su capacidad");

                            }
                            else if (diferenciaCombustible.TotalDays < 365)
                            {
                                MessageBox.Show("Error. La última fecha de limpieza fue hace menos de 1 año");
                            }
                            else
                            {
                                tanqueCombustible.Limpieza(tanqueCombustible);
                                MessageBox.Show("Correcto. La limpieza se ha completado.");
                            }
                            break;
                    } 
                }
            }
            ActualizarListaTanque(); 
        }

        private void TratamientoButton_Click(object sender, EventArgs e)
        {
            if (ValidarTanqueSeleccionado())
            {
                foreach (Object selectedItem in listBoxTanques.SelectedItems)
                {

                    Tanque tanqueSeleccionado = (Tanque)selectedItem;
                    String tipoSeleccionado = tanqueSeleccionado.GetType().Name;
                    switch (tipoSeleccionado)
                    {
                        case "TanqueAceite":
                            TanqueAceite tanqueAceite = tanqueSeleccionado as TanqueAceite;
                            tanqueAceite.Tratamiento(tanqueSeleccionado);
                            break;
                        case "TanqueAgua":
                            TanqueAgua tanqueAgua = tanqueSeleccionado as TanqueAgua;
                            tanqueAgua.Tratamiento(tanqueSeleccionado);
                            break;
                        case "TanqueCombustible":
                            TanqueCombustible tanqueCombustible = tanqueSeleccionado as TanqueCombustible;
                            tanqueCombustible.Tratamiento(tanqueSeleccionado);
                            break;
                    }
                    tanqueSeleccionado.Update();
                }
            }
            ActualizarListaTanque();
        }

        private void ReposicionButton_Click(object sender, EventArgs e)
        {
            if (ValidarTanqueSeleccionado())
            {
                List<Tanque> tanques = new List<Tanque>();
                foreach(Object selectedItem in listBoxTanques.SelectedItems){
                    Tanque unTanque=(Tanque)selectedItem;
                    tanques.Add(unTanque);
                }
                VentanaReposicion ventanaReposicion = new VentanaReposicion(tanques);
                ventanaReposicion.Show();
            }
        }

    }
}
